from flask import current_app
from util.result import Result
from PIL import Image, ImageDraw, ImageFont
import random
import string
import base64
from io import BytesIO

# 工具函数（内部复用，不对外暴露，格式对齐你的业务逻辑封装风格）
def _generate_captcha_text(length=4):
    """生成4位字母+数字的验证码文本（内部工具函数，前缀_区分）"""
    # 仅保留易区分的字符（排除 O、0、I、1 等易混淆字符，提升用户体验）
    valid_chars = string.ascii_uppercase + string.digits.replace('O', '').replace('0', '').replace('I', '').replace('1',
                                                                                                                    '')
    return ''.join(random.choice(valid_chars) for _ in range(length))


def _generate_captcha_image(captcha_text):
    """生成验证码图片并转为Base64（内部工具函数）"""
    try:
        # 图片基础配置（宽120，高40，白色背景）
        img_width, img_height = 120, 40
        image = Image.new("RGB", (img_width, img_height), (255, 255, 255))
        draw = ImageDraw.Draw(image)

        # 加载字体（优先用系统字体，不存在则用默认字体，避免报错）
        try:
            # Windows 系统字体路径（可根据部署环境调整）
            font = ImageFont.truetype("C:/Windows/Fonts/simhei.ttf", 28)
        except IOError:
            # Linux/Mac 系统字体路径（适配多环境）
            try:
                font = ImageFont.truetype("/Library/Fonts/Arial.ttf", 28)
            except IOError:
                font = ImageFont.load_default()  # 最终 fallback：默认字体

        # 绘制验证码文本（随机颜色、位置，增加机器识别难度）
        for i, char in enumerate(captcha_text):
            # 深色文字（避免与白色背景混淆，RGB 范围 30-100）
            text_color = (random.randint(30, 100), random.randint(30, 100), random.randint(30, 100))
            # 文字位置偏移（避免重叠，x轴间隔25，y轴随机偏移5-10）
            text_x = 10 + i * 25
            text_y = random.randint(5, 10)
            draw.text((text_x, text_y), char, font=font, fill=text_color)

        # 绘制干扰线（5条浅灰色线，增加噪点）
        for _ in range(5):
            line_color = (random.randint(180, 220), random.randint(180, 220), random.randint(180, 220))
            line_start = (random.randint(0, img_width), random.randint(0, img_height))
            line_end = (random.randint(0, img_width), random.randint(0, img_height))
            draw.line([line_start, line_end], fill=line_color, width=1)

        # 绘制干扰点（20个浅灰色点）
        for _ in range(20):
            point_color = (random.randint(150, 200), random.randint(150, 200), random.randint(150, 200))
            point_pos = (random.randint(0, img_width), random.randint(0, img_height))
            draw.point(point_pos, fill=point_color)

        # 图片转 Base64（前端可直接用 <img src="xxx" /> 渲染）
        buffer = BytesIO()
        image.save(buffer, format="PNG", quality=95)
        buffer.seek(0)
        img_base64 = base64.b64encode(buffer.getvalue()).decode("utf-8")
        return f"data:image/png;base64,{img_base64}";

    except Exception as e:
        current_app.logger.error(f"获取验证码异常: {str(e)}")
        return Result.error("获取验证码失败，请稍后重试")
